﻿
using System.Drawing;
using System.IO;
using AiFrame.InterfaceLib.MVP;
using AiFrame.InterfaceLib.Windows.Controls;
using AiFrame.InterfaceLib.Windows.UI;
using AiFrame.Plugins.PluginManager;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System;
using AiFrame.InterfaceLib.Windows.Themes;
using AiFrame.InterfaceLib.Policy.ProductLine;
using AiFrame.InterfaceLib.Plugins;
using AiFrame.InterfaceLib.Configuration;
using System.Collections.Generic;
using Moq;

namespace Plugins.PluginManager.Tests
{
    
    
    /// <summary>
    ///Dies ist eine Testklasse für "PluginManagerTest" und soll
    ///alle PluginManagerTest Komponententests enthalten.
    ///</summary>
    [TestClass()]
    public class PluginManagerTest
    {


        private TestContext testContextInstance;

        /// <summary>
        ///Ruft den Testkontext auf, der Informationen
        ///über und Funktionalität für den aktuellen Testlauf bietet, oder legt diesen fest.
        ///</summary>
        public TestContext TestContext
        {
            get
            {
                return testContextInstance;
            }
            set
            {
                testContextInstance = value;
            }
        }

        #region Zusätzliche Testattribute
        // 
        //Sie können beim Verfassen Ihrer Tests die folgenden zusätzlichen Attribute verwenden:
        //
        //Mit ClassInitialize führen Sie Code aus, bevor Sie den ersten Test in der Klasse ausführen.
        //[ClassInitialize()]
        //public static void MyClassInitialize(TestContext testContext)
        //{
        //}
        //
        //Mit ClassCleanup führen Sie Code aus, nachdem alle Tests in einer Klasse ausgeführt wurden.
        //[ClassCleanup()]
        //public static void MyClassCleanup()
        //{
        //}
        //
        //Mit TestInitialize können Sie vor jedem einzelnen Test Code ausführen.
        //[TestInitialize()]
        //public void MyTestInitialize()
        //{
        //}
        //
        //Mit TestCleanup können Sie nach jedem einzelnen Test Code ausführen.
        //[TestCleanup()]
        //public void MyTestCleanup()
        //{
        //}
        //
        #endregion


        /// <summary>
        ///Ein Test für "PluginManager-Konstruktor"
        ///</summary>
        [TestMethod()]
        public void PluginManagerConstructorTest()
        {
            AiFrame.Plugins.PluginManager.PluginManager target = new AiFrame.Plugins.PluginManager.PluginManager();
            Assert.IsNull(target.GetApplicationTheme());
            Assert.IsNull(target.GetProductLine());
        }

        /// <summary>
        ///Ein Test für "GetApplicationTheme"
        ///</summary>
        [TestMethod()]
        public void GetApplicationThemeTest()
        {
            AiFrame.Plugins.PluginManager.PluginManager target = new AiFrame.Plugins.PluginManager.PluginManager(); 
            target.LoadSystemLibraries();

            Assert.AreEqual(Color.White, target.GetApplicationTheme().GetPanelBeginColor());
            Assert.AreEqual(Color.Black, target.GetApplicationTheme().GetMainHeaderFontColor());
            
        }

        /// <summary>
        ///Ein Test für "GetProductLine"
        ///</summary>
        [TestMethod()]
        public void GetProductLineTest()
        {
            AiFrame.Plugins.PluginManager.PluginManager target = new AiFrame.Plugins.PluginManager.PluginManager(); 
            target.LoadSystemLibraries();
            Assert.AreEqual(ProductFamily.Standard, target.GetProductLine().GetProductLine());
            Assert.AreEqual("AiFrame CRM-System Standard Edition", target.GetProductLine().ProgramName());
        }

        /// <summary>
        ///Ein Test für "Init"
        ///</summary>
        [TestMethod()]
        [DeploymentItem("Plugins.PluginManager.dll")]
        public void InitTest()
        {
            AiFrame.Plugins.PluginManager.PluginManager_Accessor target = new AiFrame.Plugins.PluginManager.PluginManager_Accessor();
            var ciFactoryMock = new Mock<ICoreInterfaceFactory>();
            target.Init(ciFactoryMock.Object);
            
            Assert.AreEqual(ciFactoryMock.Object, target._coreInterfaceFactory);
        }

        /// <summary>
        ///Ein Test für "InvokeNewDatasetAssignedEvent"
        ///</summary>
        public void InvokeNewDatasetAssignedEventTestHelper<T>()
        {
            AiFrame.Plugins.PluginManager.PluginManager target = new AiFrame.Plugins.PluginManager.PluginManager();

            bool newAssignedCalled = false;
            target.NewDatasetAssigned += delegate
                                             {
                                                 newAssignedCalled = true;
                                             };

            var subWndContainerMock = new Mock<ISubWindowContainer<T>>();
            target.InvokeNewDatasetAssignedEvent<T>(subWndContainerMock.Object);

            subWndContainerMock.Verify(s => s.CloseSubWindows());
            Assert.IsTrue(newAssignedCalled);
        }

        [TestMethod()]
        public void InvokeNewDatasetAssignedEventTest()
        {
            InvokeNewDatasetAssignedEventTestHelper<GenericParameterHelper>();
        }
        
        /// <summary>
        ///Ein Test für "LoadPlugin"
        ///</summary>
        public void LoadPluginTestHelper<T>()
        {
            PluginManager_Accessor target = new PluginManager_Accessor();

            var ciFactoryMock = new Mock<ICoreInterfaceFactory>();
            var ciMock = new Mock<ICoreInterface>();
            ciFactoryMock.Setup(f => f.CreateCoreInterface()).Returns(ciMock.Object);
            var toolbarMock = new Mock<IToolBarManager>();
            ciFactoryMock.Setup(f => f.CreateCoreInterface().ToolBarManager).Returns(toolbarMock.Object);
            var navBarMock = new Mock<INavigationBar>();
            ciFactoryMock.Setup(f => f.CreateCoreInterface().NavigationBar).Returns(navBarMock.Object);
            
            target.Init(ciFactoryMock.Object);
            
            target.LoadPlugins(Directory.GetCurrentDirectory());
            
            Assert.AreEqual("Startscreen-Plugin", target._pluginCollection[0].GetCaption());
        }

        [TestMethod()]
        [DeploymentItem("Plugins.PluginManager.dll")]
        public void LoadPluginTest()
        {
            LoadPluginTestHelper<GenericParameterHelper>();
        }     
        
    }
}
